home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import thread
- import urllib2
- import httplib
- import os
- import string
- import apt_pkg
- import time
- import sys
- import rfc822
- from ConfigParser import ConfigParser
- from subprocess import Popen, PIPE
- from utils import *
-
- class Dist(object):
-
- def __init__(self, name, version, date, supported):
- self.name = name
- self.version = version
- self.date = date
- self.supported = supported
- self.releaseNotesURI = None
- self.upgradeTool = None
- self.upgradeToolSig = None
-
-
-
- class MetaReleaseCore(object):
- '''
- A MetaReleaseCore object astracts the list of released
- distributions.
- '''
- DEBUG = 'DEBUG_UPDATE_MANAGER' in os.environ
- CONF = '/etc/update-manager/release-upgrades'
- CONF_METARELEASE = '/etc/update-manager/meta-release'
-
- def __init__(self, useDevelopmentRelease = False, useProposed = False, forceLTS = False):
- self._debug('MetaRelease.__init__() useDevel=%s useProposed=%s' % (useDevelopmentRelease, useProposed))
- self.downloading = True
- self.new_dist = None
- self.current_dist_name = get_dist()
- self.no_longer_supported = None
- self.METARELEASE_URI = 'http://changelogs.ubuntu.com/meta-release'
- self.METARELEASE_URI_LTS = 'http://changelogs.ubuntu.com/meta-release-lts'
- self.METARELEASE_URI_UNSTABLE_POSTFIX = '-development'
- self.METARELEASE_URI_PROPOSED_POSTFIX = '-development'
- parser = ConfigParser()
- if os.path.exists(self.CONF_METARELEASE):
- parser.read(self.CONF_METARELEASE)
- if parser.has_section('METARELEASE'):
- sec = 'METARELEASE'
- for k in [
- 'URI',
- 'URI_LTS',
- 'URI_UNSTABLE_POSTFIX',
- 'URI_PROPOSED_POSTFIX']:
- if parser.has_option(sec, k):
- self._debug('%s: %s ' % (self.CONF_METARELEASE, parser.get(sec, k)))
- setattr(self, '%s_%s' % (sec, k), parser.get(sec, k))
- continue
-
-
-
- parser = ConfigParser()
- if os.path.exists(self.CONF):
- parser.read(self.CONF)
- if parser.has_option('DEFAULT', 'Prompt'):
- type = parser.get('DEFAULT', 'Prompt').lower()
- if type == 'never' or type == 'no':
- self.downloading = False
- return None
- if type == 'lts':
- self.METARELEASE_URI = self.METARELEASE_URI_LTS
-
-
-
- if forceLTS:
- self.METARELEASE_URI = self.METARELEASE_URI_LTS
-
- if useDevelopmentRelease:
- self.METARELEASE_URI += self.METARELEASE_URI_UNSTABLE_POSTFIX
- elif useProposed:
- self.METARELEASE_URI += self.METARELEASE_URI_PROPOSED_POSTFIX
-
- self._debug('metarelease-uri: %s' % self.METARELEASE_URI)
- self.metarelease_information = None
- if not self._buildMetaReleaseFile():
- self._debug('_buildMetaReleaseFile failed')
- return None
- t = thread.start_new_thread(self.download, ())
-
-
- def _buildMetaReleaseFile(self):
- self.METARELEASE_FILE = os.path.join('/var/lib/update-manager/', os.path.basename(self.METARELEASE_URI))
-
- try:
- open(self.METARELEASE_FILE, 'a')
- except IOError:
- e = None
- path = os.path.expanduser('~/.update-manager-core/')
- if not os.path.exists(path):
-
- try:
- os.mkdir(path)
- except OSError:
- e = None
- sys.stderr.write("mkdir() failed: '%s'" % e)
- return False
-
-
- None<EXCEPTION MATCH>OSError
- self.METARELEASE_FILE = os.path.join(path, os.path.basename(self.METARELEASE_URI))
-
-
- try:
- if os.path.getsize(self.METARELEASE_FILE) == 0:
- os.unlink(self.METARELEASE_FILE)
- except Exception:
- e = None
-
- return True
-
-
- def dist_no_longer_supported(self, dist):
- ''' virtual function that is called when the distro is no longer
- supported
- '''
- self.no_longer_supported = dist
-
-
- def new_dist_available(self, dist):
- ''' virtual function that is called when a new distro release
- is available
- '''
- self.new_dist = dist
-
-
- def parse(self):
- self._debug('MetaRelease.parse()')
- current_dist_name = self.current_dist_name
- self._debug("current dist name: '%s'" % current_dist_name)
- current_dist = None
- dists = []
- index_tag = apt_pkg.ParseTagFile(self.metarelease_information)
- step_result = index_tag.Step()
- while step_result:
- if index_tag.Section.has_key('Dist'):
- name = index_tag.Section['Dist']
- rawdate = index_tag.Section['Date']
- date = time.mktime(rfc822.parsedate(rawdate))
- supported = int(index_tag.Section['Supported'])
- version = index_tag.Section['Version']
- dist = Dist(name, version, date, supported)
- if index_tag.Section.has_key('ReleaseNotes'):
- dist.releaseNotesURI = index_tag.Section['ReleaseNotes']
-
- if index_tag.Section.has_key('UpgradeTool'):
- dist.upgradeTool = index_tag.Section['UpgradeTool']
-
- if index_tag.Section.has_key('UpgradeToolSignature'):
- dist.upgradeToolSig = index_tag.Section['UpgradeToolSignature']
-
- dists.append(dist)
- if name == current_dist_name:
- current_dist = dist
-
-
- step_result = index_tag.Step()
- if current_dist is None:
- return False
- upgradable_to = ''
- for dist in dists:
- if dist.date > current_dist.date and dist.supported == True:
- upgradable_to = dist
- self._debug('new dist: %s' % upgradable_to)
- break
- continue
- current_dist is None
-
- if upgradable_to != '' and not (current_dist.supported):
- self.dist_no_longer_supported(upgradable_to)
-
- if upgradable_to != '':
- self.new_dist_available(upgradable_to)
-
- return True
-
-
- def download(self):
- self._debug('MetaRelease.download()')
- lastmodified = 0
- req = urllib2.Request(self.METARELEASE_URI)
- req.add_header('Cache-Control', 'No-Cache')
- req.add_header('Pragma', 'no-cache')
- if os.access(self.METARELEASE_FILE, os.W_OK):
- lastmodified = os.stat(self.METARELEASE_FILE).st_mtime
-
- if lastmodified > 0:
- req.add_header('If-Modified-Since', time.asctime(time.gmtime(lastmodified)))
-
-
- try:
- uri = urllib2.urlopen(req)
- if os.path.exists(self.METARELEASE_FILE) and not os.access(self.METARELEASE_FILE, os.W_OK):
-
- try:
- os.unlink(self.METARELEASE_FILE)
- except OSError:
- e = None
- print "Can't unlink '%s' (%s)" % (self.METARELEASE_FILE, e)
- except:
- None<EXCEPTION MATCH>OSError
-
-
- None<EXCEPTION MATCH>OSError
-
- try:
- f = open(self.METARELEASE_FILE, 'w+')
- for line in uri.readlines():
- f.write(line)
-
- f.flush()
- f.seek(0, 0)
- self.metarelease_information = f
- except IOError:
- e = None
-
- uri.close()
- except (urllib2.URLError, httplib.BadStatusLine):
- e = None
- if os.path.exists(self.METARELEASE_FILE):
- self.metarelease_information = open(self.METARELEASE_FILE, 'r')
-
- except:
- os.path.exists(self.METARELEASE_FILE)
-
- if self.metarelease_information != None:
- self._debug('have self.metarelease_information')
- self.parse()
- else:
- self._debug('NO self.metarelease_information')
- self.downloading = False
-
-
- def _debug(self, msg):
- if self.DEBUG:
- sys.stderr.write(msg + '\n')
-
-
-
- if __name__ == '__main__':
- meta = MetaReleaseCore(False, False)
-
-